#
# Obtain version information from recipes
#
# The 'archive_curr_version' function takes the archive type and name as
# arguments and returns the version identifier as present in the corresponding
# recipe. The nested foreach loop populates 'ARCHIVE_VERSION' with the version
# identifier for each archive.
#
# If an archive is given with a complete (versioned) name, we don't need to
# consult any recipe but only check if the corresponding archive exists within
# the depot. For binary archives, it suffices that the corresponding source
# archive is present.
#

$(foreach TYPE,api src raw pkg,\
   $(foreach A,${ARCHIVES(${TYPE})},\
      $(eval ARCHIVE_VERSION($A) := $(call archive_curr_version,$A))))

archive_exists_in_depot = $(wildcard $(DEPOT_DIR)/$1)

ARCHIVES_WITH_NO_VERSION := $(sort \
                               $(foreach TYPE,api src raw pkg,\
                                  $(foreach A,${ARCHIVES(${TYPE})},\
                                    $(if $(call archive_exists_in_depot,$A),,\
                                       $(if ${ARCHIVE_VERSION($A)},,$A)))))

checked_versions_defined:
ifneq ($(ARCHIVES_WITH_NO_VERSION),)
	@echo "Error: incomplete or missing recipe ($(sort $(ARCHIVES_WITH_NO_VERSION)))"; false
endif

#
# Read content of a file as list, sort it and remove duplicates
#
# \param $1  absolute file path
#
sorted_file_content = $(if $(wildcard $1),$(shell cat $1 | $(SORT) -u),\
                                          $(error Failed to read file $1))

#
# Absolute path to content.mk file for given archive
#
# \param $1  archive type, can be 'src', 'api' or 'raw'
# \param $2  api, src or raw archive name in the form 'genodelabs/api/base'
#
content_mk_file = $(addsuffix /content.mk,$(call recipe_dir,$1/$(call archive_recipe,$2)))

#
# Return a given string minus another given string
#
# \param $1  string that shall be returned minus the other one
# \param $2  string that shall be removed from the other one
#
remove_from_string=$(1:$2=)

#
# Repository directory for a given recipe name
#
# \param $1  recipe type in the form 'api'
# \param $2  recipe name in the form 'base'
#
rep_dir_of_recipe=$(call remove_from_string,$(call recipe_dir,$1/$2),/recipes/$1/$2)

#
# Repository directory for a given archive
#
# \param $1  archive type in the form 'api'
# \param $2  archive name in the form 'genodelabs/api/base'
#
rep_dir_of_archive=$(call rep_dir_of_recipe,$1,$(call archive_recipe,$2))

# path to temporary file that is used to buffer the names of missing ports
MISSING_PORTS_FILE := $(DEPOT_DIR)/var/missing_ports

# path to temporary make file that is created to fill the missing-ports file
GEN_MISSING_PORTS_MK := $(DEPOT_DIR)/var/gen_missing_ports.mk

# wether to invoke sub-makes with '--quiet'
QUIET = $(if $(VERBOSE),--quiet)

#
# Invoke sub-make to create or update missing-ports file
#
update_missing_ports_file: checked_versions_defined checked_no_uncategorized
	$(VERBOSE)mkdir -p $(dir $(GEN_MISSING_PORTS_MK))
	$(VERBOSE)( echo -e "all:\n"; \
	            echo -e "MAKE := $(MAKE)\n"; \
	            $(foreach TYPE,api src raw pkg,\
	                $(foreach A,${ARCHIVES(${TYPE})},\
	                   target=$(call versioned_archive,$A); \
	                   content_mk=$(call content_mk_file,$(TYPE),$A); \
	                   rep_dir=$(call rep_dir_of_archive,$(TYPE),$A); \
	                   echo "ARCHIVES(${TYPE}) += $$target"; \
	                   echo "CONTENT_MK($$target) := $$content_mk"; \
	                   echo "REP_DIR($$target) := $$rep_dir"; \
	            ) ) \
	            echo -e ""; \
	            $(foreach A,${ARCHIVES(pkg)},\
	               $(foreach DEP,$(call pkg_pkg_archives,$A),\
	                  echo -e "$(call versioned_archive,$A) :" \
	                          "$(call versioned_archive,$(DEP))";)) \
	            echo -e ""; \
	            echo -e "\$${ARCHIVES(src)} : \$${ARCHIVES(api)}"; \
	            echo -e "\$${ARCHIVES(pkg)} : \$${ARCHIVES(api)}"; \
	            echo -e "\$${ARCHIVES(pkg)} : \$${ARCHIVES(src)}"; \
	            echo -e "\$${ARCHIVES(pkg)} : \$${ARCHIVES(raw)}"; \
	            echo -e "\nTARGETS := \$$(foreach T,api src raw,\$${ARCHIVES(\$$T)})"; \
	            echo -e "\nall: \$$(TARGETS)"; \
	            echo -e "\n\$$(TARGETS):"; \
	            echo -e "\t$(VERBOSE)\$$(MAKE) \\"; \
	            echo -e "\t   $(QUIET) \\"; \
	            echo -e "\t   -f $(GENODE_DIR)/tool/depot/mk/content_env_missing_ports.mk \\"; \
	            echo -e "\t   GENODE_DIR=$(GENODE_DIR) \\"; \
	            echo -e "\t   CONTRIB_DIR=$(GENODE_DIR)/contrib \\"; \
	            echo -e "\t   CONTENT_MK=\$${CONTENT_MK(\$$@)} \\"; \
	            echo -e "\t   REP_DIR=\$${REP_DIR(\$$@)} \\"; \
	            echo -e "\t   MISSING_PORTS_FILE=$(MISSING_PORTS_FILE) \\"; \
	            echo -e "\t   VERBOSE=$(VERBOSE)"; \
	          ) > $(GEN_MISSING_PORTS_MK)
	$(VERBOSE)mkdir -p $(dir $(MISSING_PORTS_FILE))
	$(VERBOSE)rm -f $(MISSING_PORTS_FILE)
	$(VERBOSE)touch $(MISSING_PORTS_FILE)
	$(VERBOSE)$(MAKE) $(QUIET) -C $(DEPOT_DIR) -f $(GEN_MISSING_PORTS_MK);
